home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / aminet / mus / edit / amisox_wav.lha / misc.c < prev    next >
C/C++ Source or Header  |  1992-03-27  |  5KB  |  258 lines

  1. /*
  2.  * July 5, 1991
  3.  * Copyright 1991 Lance Norskog And Sundry Contributors
  4.  * This source code is freely redistributable and may be used for
  5.  * any purpose.  This copyright notice must be maintained. 
  6.  * Lance Norskog And Sundry Contributors are not responsible for 
  7.  * the consequences of using this software.
  8.  */
  9.  
  10. /*
  11.  * Sound Tools miscellaneous stuff.
  12.  */
  13.  
  14. char *sizes[] = {
  15.     "NONSENSE!",
  16.     "bytes",
  17.     "shorts",
  18.     "longs",
  19.     "32-bit floats",
  20.     "64-bit floats",
  21.     "IEEE floats"
  22. };
  23.  
  24. char *styles[] = {
  25.     "NONSENSE!",
  26.     "unsigned",
  27.     "signed (2's complement)",
  28.     "u-law",
  29.     "a-law"
  30. };
  31.  
  32. char readerr[] = "Premature EOF while reading sample file.";
  33. char writerr[] = "Error writing sample file.  You are probably out of disk space.";
  34.  
  35. #include "st.h"
  36.  
  37. /* Utilities */
  38.  
  39. /* Read short, little-endian: little end first. VAX/386 style. */
  40. unsigned short
  41. rlshort(ft)
  42. ft_t ft;
  43. {
  44.     unsigned char uc, uc2;
  45.     uc  = getc(ft->fp);
  46.     uc2 = getc(ft->fp);
  47.     return (uc2 << 8) | uc;
  48. }
  49.  
  50. /* Read short, bigendian: big first. 68000/SPARC style. */
  51. unsigned short
  52. rbshort(ft)
  53. ft_t ft;
  54. {
  55.     unsigned char uc, uc2;
  56.     uc2 = getc(ft->fp);
  57.     uc  = getc(ft->fp);
  58.     return (uc2 << 8) | uc;
  59. }
  60.  
  61. /* Write short, little-endian: little end first. VAX/386 style. */
  62. unsigned short
  63. wlshort(ft, us)
  64. ft_t ft;
  65. unsigned short us;
  66. {
  67.     putc(us, ft->fp);
  68.     putc(us >> 8, ft->fp);
  69.     if (ferror(ft->fp))
  70.         fail(writerr);
  71. }
  72.  
  73. /* Write short, big-endian: big end first. 68000/SPARC style. */
  74. unsigned short
  75. wbshort(ft, us)
  76. ft_t ft;
  77. unsigned short us;
  78. {
  79.     putc(us >> 8, ft->fp);
  80.     putc(us, ft->fp);
  81.     if (ferror(ft->fp))
  82.         fail(writerr);
  83. }
  84.  
  85. /* Read long, little-endian: little end first. VAX/386 style. */
  86. unsigned long
  87. rllong(ft)
  88. ft_t ft;
  89. {
  90.     unsigned char uc, uc2, uc3, uc4;
  91. /*    if (feof(ft->fp))
  92.         fail(readerr);        /* No worky! */
  93.     uc  = getc(ft->fp);
  94.     uc2 = getc(ft->fp);
  95.     uc3 = getc(ft->fp);
  96.     uc4 = getc(ft->fp);
  97.     return ((long)uc4 << 24) | ((long)uc3 << 16) | ((long)uc2 << 8) | (long)uc;
  98. }
  99.  
  100. /* Read long, bigendian: big first. 68000/SPARC style. */
  101. unsigned long
  102. rblong(ft)
  103. ft_t ft;
  104. {
  105.     unsigned char uc, uc2, uc3, uc4;
  106. /*    if (feof(ft->fp))
  107.         fail(readerr);        /* No worky! */
  108.     uc  = getc(ft->fp);
  109.     uc2 = getc(ft->fp);
  110.     uc3 = getc(ft->fp);
  111.     uc4 = getc(ft->fp);
  112.     return ((long)uc << 24) | ((long)uc2 << 16) | ((long)uc3 << 8) | (long)uc4;
  113. }
  114.  
  115. /* Write long, little-endian: little end first. VAX/386 style. */
  116. unsigned long
  117. wllong(ft, ul)
  118. ft_t ft;
  119. unsigned long ul;
  120. {
  121. int datum;
  122.  
  123.     datum = (ul) & 0xff;
  124.     putc(datum, ft->fp);
  125.     datum = (ul >> 8) & 0xff;
  126.     putc(datum, ft->fp);
  127.     datum = (ul >> 16) & 0xff;
  128.     putc(datum, ft->fp);
  129.     datum = (ul >> 24) & 0xff;
  130.     putc(datum, ft->fp);
  131.     if (ferror(ft->fp))
  132.         fail(writerr);
  133. }
  134.  
  135. /* Write long, big-endian: big end first. 68000/SPARC style. */
  136. unsigned long
  137. wblong(ft, ul)
  138. ft_t ft;
  139. unsigned long ul;
  140. {
  141. int datum;
  142.  
  143.     datum = (ul >> 24) & 0xff;
  144.     putc(datum, ft->fp);
  145.     datum = (ul >> 16) & 0xff;
  146.     putc(datum, ft->fp);
  147.     datum = (ul >> 8) & 0xff;
  148.     putc(datum, ft->fp);
  149.     datum = (ul) & 0xff;
  150.     putc(datum, ft->fp);
  151.     if (ferror(ft->fp))
  152.         fail(writerr);
  153. }
  154.  
  155. /* Read and write words and longs in "machine format".  Swap if indicated. */
  156.  
  157. /* Read short. */
  158. unsigned short
  159. rshort(ft)
  160. ft_t ft;
  161. {
  162.     unsigned short us;
  163.  
  164. /*    if (feof(ft->fp))
  165.         fail(readerr);        /* No worky! */
  166.     fread(&us, 2, 1, ft->fp);
  167.     if (ft->swap)
  168.         us = swapw(us);
  169.     return us;
  170. }
  171.  
  172. /* Write short. */
  173. unsigned short
  174. wshort(ft, us)
  175. ft_t ft;
  176. unsigned short us;
  177. {
  178.     if (ft->swap)
  179.         us = swapw(us);
  180.     if (fwrite(&us, 2, 1, ft->fp) != 1)
  181.         fail(writerr);
  182. }
  183.  
  184. /* Read long. */
  185. unsigned long
  186. rlong(ft)
  187. ft_t ft;
  188. {
  189.     unsigned long ul;
  190.  
  191. /*    if (feof(ft->fp))
  192.         fail(readerr);        /* No worky! */
  193.     fread(&ul, 4, 1, ft->fp);
  194.     if (ft->swap)
  195.         ul = swapl(ul);
  196.     return ul;
  197. }
  198.  
  199. /* Write long. */
  200. unsigned long
  201. wlong(ft, ul)
  202. ft_t ft;
  203. unsigned long ul;
  204. {
  205.     if (ft->swap)
  206.         ul = swapl(ul);
  207.     if (fwrite(&ul, 4, 1, ft->fp) != 1)
  208.         fail(writerr);
  209. }
  210.  
  211. /* Byte swappers */
  212.  
  213. unsigned short
  214. swapw(us)
  215. unsigned short us;
  216. {
  217.     return ((us >> 8) | (us << 8)) & 0xffff;
  218. }
  219.  
  220. unsigned long
  221. swapl(ul)
  222. unsigned long ul;
  223. {
  224.     return (ul >> 24) | ((ul >> 8) & 0xff00) | ((ul << 8) & 0xff0000) | (ul << 24);
  225. }
  226.  
  227. /* dummy routine for do-nothing functions */
  228. int nothing() {;}
  229.  
  230. /* dummy drain routine for effects */
  231. null_drain(effp, obuf, osamp)
  232. eff_t effp;
  233. long *obuf;
  234. long *osamp;
  235. {
  236.     *osamp = 0;
  237. }
  238.  
  239. /* here for linear interp.  might be useful for other things */
  240. gcd(a, b) 
  241. int a, b;
  242. {
  243.     if (b == 0)
  244.         return a;
  245.     else
  246.         return gcd(b, a % b);
  247. }
  248.  
  249. lcm(a, b) 
  250. int a, b;
  251. {
  252.     int m;
  253.  
  254.     return (a * b) / gcd(a, b);
  255. }
  256.  
  257. /* sine wave gen should be here, also */
  258.